#ifndef ADX_H
#define ADX_H
#include <list>
#include <string>
#include <time.h>
#include <stdio.h>
#include <string>

using namespace std;

/**
  *@brief Descreve os metodos para calcular ADX
  *
  */
class ADX
{
public:

    ///construtor padrao
    ADX();

    ///construtor para dados de entrada
    ADX( string data, double alta, double baixa, double fechamento);

    ///construtor para dados calculados
    ADX( double IDpos, double IDneg, double resADX, string datas);

    //contrutor para dados temporarios
    ADX (string data, double dAlta, double Baixa, double indMovDirPos,
         double indMovDirNeg,double FV,double FVMed,double MDMpos,
         double MDMneg,double DX, double resADX);

    /// valor delta baixa
    double dBaixa;

    /// valor delta alta
    double dAlta;

    /// valor faixa verdade
    double FV;

    /// valor indice de movimento direcional
    double ImovDir;

    /// valor ADX
    double resADX;

    /// valor indice de movimento positivo (DI+)
    double IDpos;

    /// valor indice de movimento negativo (DI-)
    double IDneg;

    /// valor indice movimenta��o direcional positiva (DM+)
    double indMovDirPos;

    /// valor indice movimenta��o direcional negativa (DM-)
    double indMovDirNeg;

    /// valor media do indice movimenta��o direcional positiva (DM+media)
    double MDMpos;

    /// valor media do indice movimenta��o direcional negativa (DM-media)
    double MDMneg;

    /// valor faixa verdade media (TR)
    double FVMed;

    /// movimento direcional (DX)
    double DX;



    void imprime(string st, double a, double b, double c);
    void imprime2(string data, double a, double b, double c, double d);
    void deltaAlta( double altaAtual, double altaAnt );
    void deltaBaixa(double baixaAtual, double baixaAnt);
    void indMovDir (double dAlta, double dBaixa );                      // movimento direcional positivo ou negativo
    void indMovDirMedio ( int n, double mdmpos, double mdmneg, double alfa );      //indicador de mov direcional MEDIO pos ou neg
    void faixaVerdade (double alta, double baixa, double fechAnt );
    void faixaVerdMedia (double n, double fvmed, double alfa );
    void indiceDirecional(); //DI+ e DI-
    void movimentoDirecional(); //calcula DX
    void indiceDirecionalMedio(double n, double adxAnt, double alfa ); // ADX


    //variaveis de entrada

    double altaAtual;   // valor de alta da a��o atual (base de dados 'high')
    double baixaAtual;  // valor de baixa da a��o atual (base de dados'low')
    double fechAnt;     // valor de fechamemento da a��o do dia anterior (base de dados'close')
    //int N;           // periodo ou faixa de dados (tamanho da lista com base na faixa de datas escolhida)
    string data;

};

#endif // ADX_H
